package com.xiyuan;

import com.xiyuan.config.Config;
import com.xiyuan.smartutils.Files;
import com.xiyuan.smartutils.IoUtils;
import com.xiyuan.smartutils.constants.CodeConstants;
import com.xiyuan.smartutils.constants.SignConstants;
import com.xiyuan.smartutils.constants.SysConstants;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.HashMap;

/**
 * 系统工程命令类，向监听类发起命令请求
 * 
 * 1. -s表示启动
 * 2. -c表示工程退出
 * 3. -i表示查看信息
 * 4. -t表示测试配置文件（TODO 暂未实现）
 * 5. -r表示重新加载配置（TODO 暂未实现）
 * 6. -h表示帮助
 * 7. -?表示帮助
 * 
 * @version v1.0.0 @author lgz 2017-8-27 新建与整理
 */
final class SysCommand implements SysConstants, SignConstants, CodeConstants
{
    /** 不允许实例化 */
    private SysCommand(){};
    
    /** 命令集 */
    private static final HashMap<String, String> commandMap = new HashMap<>();
    static
    {
        commandMap.put(START_A,       START_C);
        commandMap.put(CLOSE_A,       CLOSE_C);
        commandMap.put(INFO_A,        INFO_C);
        commandMap.put(TEST_A,        TEST_C);
        commandMap.put(RELOAD_A,      RELOAD_C);
        commandMap.put(HELP_A,        HELP_C);
        commandMap.put(QUESTION_A,    QUESTION_C);
    }
    
    /** 命令入口 */
    static void command(String[] args)
    {
        String cmd = commandMap.get(args[0]);
        if (cmd == null)
        {
            System.out.println("配置错误:\r\n不支持的参数，请使用-h查看支持的参数\r\n");
            System.exit(0);
            return;
        }
        
        String path = null;
        if (Files.exists(BOOT_CONF_XML))
            path = BOOT_CONF_XML;
        else if (Files.exists(BOOT_CONF_INI))
            path = BOOT_CONF_INI;
        
        if (path == null)
        {
            System.out.println("配置错误:\r\n配置文件[./conf/zhiqim.xml]和[./conf/zhiqim.ini]都不存在，请按手册配置目录结构\r\n");
            System.exit(0);
            return;
        }
        
        Socket s = null;
        
        try
        {
            Config config = new Config(NAME, BOOT_CONF_XML);
            config.load();
            
            int port = config.getInt(BOOT, ITEM_PORT);
            if (port < 1 || port > 65535)
            {
                System.out.println("配置错误:\r\n配置文件["+path+"]端口不正确\r\n");
                System.exit(0);
                return;
            }
            
            s = new Socket(InetAddress.getByName("127.0.0.1"), port);
            OutputStream out = s.getOutputStream();
            out.write((NAME + _BR_ + cmd + _BR_).getBytes());
            out.flush();
            
            if (START_C.equals(cmd) || CLOSE_C.equals(cmd))
            {//启动和关闭无需消息
                s.shutdownOutput();
            }
            else
            {//其他的等待消息
                InputStream in = s.getInputStream();
                String result = IoUtils.readStringUTF8(in);
                System.out.println(result);
            }
        }
        catch (ConnectException e) 
        {
            System.out.println("连接失败:\r\n工程可能未启动\r\n");
        }
        catch (Throwable e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (s != null)
                try{s.close();}catch(Exception e){}
            
            System.exit(0);
        }
    }
}
